package com.wen.edu.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wen.edu.entity.EduSubject;
import com.wen.edu.entity.excel.ExcelSubjectData;
import com.wen.edu.service.EduSubjectService;
import com.wen.servicebase.exception.BusinessException;

/**
 * @Author：Win
 * @Date: 2021/5/29 14:42
 * @Description: 因为ExcelSubjectListener这个监听类不能交给spring进行管理，所以不能注入其他对象，但是它又需要相关的service
 * 所以，可以通过该类的有参构造进行属性注入
 */
public class ExcelSubjectListener extends AnalysisEventListener<ExcelSubjectData> {
    private EduSubjectService eduSubjectService;

    public ExcelSubjectListener() {
    }

    public ExcelSubjectListener(EduSubjectService eduSubjectService) {
        this.eduSubjectService = eduSubjectService;
    }

    /**
     * 读取Excel文件内容的底层方法，一行一行的读取
     *
     * @param excelSubjectData 读取的对象
     * @param analysisContext
     */
    @Override
    public void invoke(ExcelSubjectData excelSubjectData, AnalysisContext analysisContext) {
//        判断要读取的文件对象是否为空
        if (excelSubjectData == null) {
            throw new BusinessException("文件数据为空~~~");
        }
//        判断一级分类是否重复
        EduSubject oneSubject = existsOneSubject(eduSubjectService, excelSubjectData.getOneSubjectName());
        if (oneSubject == null) {
            oneSubject = new EduSubject();
//            设置parent_id
            oneSubject.setParentId("0");
//            设置一级分类名称
            oneSubject.setTitle(excelSubjectData.getOneSubjectName());
//            进行数据保存
            eduSubjectService.save(oneSubject);
        }
//        判断二级分类是否重复
        EduSubject twoSubject = existsTwoSubject(eduSubjectService, excelSubjectData.getTwoSubjectName(), oneSubject.getId());
        if (twoSubject == null) {
            twoSubject = new EduSubject();
            //            设置parent_id
            twoSubject.setParentId(oneSubject.getId());
            //            设置二级分类名称
            twoSubject.setTitle(excelSubjectData.getTwoSubjectName());
            //            进行数据保存
            eduSubjectService.save(twoSubject);
        }
    }

    /**
     * 判断一级分类的目标是否已经在数据库中存在
     *
     * @param eduSubjectService 操作数据库查询的对象
     * @param name              要查询的一级分类名称
     * @return 如果存在，就不重复添加，反之(null)，则添加到数据库中
     */
    private EduSubject existsOneSubject(EduSubjectService eduSubjectService, String name) {
//        查询条件，数据库中的title=name和parent_id=0
        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
        wrapper.eq("title", name);
        wrapper.eq("parent_id", "0");
        return eduSubjectService.getOne(wrapper);
    }

    /**
     * 判断同一个一级分类下的二级分类的目标是否已经在数据库中存在
     *
     * @param eduSubjectService 操作数据库查询的对象
     * @param name              要查询的二级分类名称
     * @param pid               要查询的一级分类的id即为二级分类的父ID
     * @return 如果存在，就不重复添加，反之(null)，则添加到数据库中
     */
    private EduSubject existsTwoSubject(EduSubjectService eduSubjectService, String name, String pid) {
//        查询条件，数据库中的title=name和parent_id=0
        QueryWrapper<EduSubject> wrapper = new QueryWrapper<>();
        wrapper.eq("title", name);
        wrapper.eq("parent_id", pid);
        return eduSubjectService.getOne(wrapper);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }
}
